/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.fatecpg.util;

import java.util.Vector;
import javax.microedition.lcdui.Display;

/**
 *
 * @author Edison
 */
public class IPUtil {

    public static String getMascara(int bits) {
        String retorno = null;
//        String[] octetos = split(ip, ".");
        String[] mascara = new String[4];
        //System.out.println("################### ENTROU 1");
        int indiceMascaraQuebrada = ((int) (bits / 8));
       // System.out.println("################### VALOR BITS DA MASCARA QUEBRADA: " + indiceMascaraQuebrada);
       // System.out.println("################### BITS DA MASCARA QUEBRADA: " + bits % 8);
        for (int c = 0; c < 4; c++) {
           // System.out.println("######entrou for");
            if (indiceMascaraQuebrada == c) {
              //  System.out.println("######entrou if c: " + c + " quebrada " + bits % 8);
                int b = bits % 8;
                switch (b) {

                    case 0:
                        mascara[c] = "0";
                        break;
                    case 1:
                        mascara[c] = "128";
                        break;
                    case 2:
                        mascara[c] = "192";
                        break;
                    case 3:
                        mascara[c] = "224";
                        break;
                    case 4:
                        mascara[c] = "240";
                        break;
                    case 5:
                        mascara[c] = "248";
                        break;
                    case 6:
                        mascara[c] = "252";
                        break;
                    case 7:
                        mascara[c] = "254";
                        break;
                }
            } else if (indiceMascaraQuebrada > c) {
              //  System.out.println("######### entrou if > que contador");
                mascara[c] = "255";
            } else {
             //   System.out.println("########## entrou else");
                mascara[c] = "0";
            }
        }

        retorno = mascara[0] + "." + mascara[1] + "." + mascara[2] + "." + mascara[3];
        //System.out.println("#######################RETORNO: " + retorno);
        return retorno;
    }

    public static String getNetID(String ip, String mascara) {
        String retorno = null;
        String[] octetosIP = split(ip, ".");
        String[] octetosMascara = split(mascara, ".");
        String[] octetosNetID = new String[4];
        for (int c = 0; c < 4; c++) {
            if (octetosMascara[c].equals("255")) {
                octetosNetID[c] = octetosIP[c];
            } else if (octetosMascara[c].equals("0")) {
                octetosNetID[c] = "0";
            } else {
                int nIP = Integer.parseInt(octetosIP[c]);
                int nMascara = Integer.parseInt(octetosMascara[c]);
                int nNetID = ((int) (nIP / (256 - nMascara))) * (256 - nMascara);
                octetosNetID[c] = "" + nNetID;
            }
        }
        retorno = octetosNetID[0] + "." + octetosNetID[1] + "." + octetosNetID[2] + "." + octetosNetID[3];

        return retorno;
    }

    public static String[] split(String original, String separator) {
        Vector nodes = new Vector();
        // Parse nodes into vector
        int index = original.indexOf(separator);
        while (index >= 0) {
            nodes.addElement(original.substring(0, index));
            original = original.substring(index + separator.length());
            index = original.indexOf(separator);
        }
        nodes.addElement(original);


        String[] result = new String[nodes.size()];
        if (nodes.size() > 0) {
            for (int loop = 0; loop < nodes.size(); loop++) {
                result[loop] = (String) nodes.elementAt(loop);
                System.out.println(result[loop]);
            }

        }
        return result;
    }

    public static String getPrimeiroIPValido(String netID) {
        String retorno = null;
        String[] octetosPrimeiroValido = split(netID, ".");
        int oct1 = Integer.parseInt(octetosPrimeiroValido[0]);
        int oct2 = Integer.parseInt(octetosPrimeiroValido[1]);
        int oct3 = Integer.parseInt(octetosPrimeiroValido[2]);
        int oct4 = Integer.parseInt(octetosPrimeiroValido[3]);

        if (oct4 == 255) {
            if (oct3 == 255) {
                if (oct2 == 255) {
                    if (oct1 == 255) {
                        return "Impossível calcular o Primeiro IP Válido";
                    } else {
                        oct1++;
                    }
                } else {
                    oct2++;
                }
            } else {
                oct3++;
            }
        } else {
            oct4++;
        }
        retorno = oct1 + "." + oct2 + "." + oct3 + "." + oct4;
        return retorno;
    }

    public static String getBroadCast(String mascara, String netID) {
        String retorno = null;
        String[] octetosMascara = split(mascara, ".");
        String[] octetosNetID = split(netID, ".");

        int mascaraOct1 = Integer.parseInt(octetosMascara[0]);
        int mascaraOct2 = Integer.parseInt(octetosMascara[1]);
        int mascaraOct3 = Integer.parseInt(octetosMascara[2]);
        int mascaraOct4 = Integer.parseInt(octetosMascara[3]);

        int netIDOct1 = Integer.parseInt(octetosNetID[0]);
        int netIDOct2 = Integer.parseInt(octetosNetID[1]);
        int netIDOct3 = Integer.parseInt(octetosNetID[2]);
        int netIDOct4 = Integer.parseInt(octetosNetID[3]);

        int broadOct1 = (255 - mascaraOct1) + netIDOct1;
        int broadOct2 = (255 - mascaraOct2) + netIDOct2;
        int broadOct3 = (255 - mascaraOct3) + netIDOct3;
        int broadOct4 = (255 - mascaraOct4) + netIDOct4;

        retorno = broadOct1 + "." + broadOct2 + "." + broadOct3 + "." + broadOct4;

        return retorno;
    }

    public static String getUltimoIPValido(String broadcast) {
        String retorno = null;
        String[] octetosUltimoValido = split(broadcast, ".");
        int oct1 = Integer.parseInt(octetosUltimoValido[0]);
        int oct2 = Integer.parseInt(octetosUltimoValido[1]);
        int oct3 = Integer.parseInt(octetosUltimoValido[2]);
        int oct4 = Integer.parseInt(octetosUltimoValido[3]);

        if (oct4 == 0) {
            if (oct3 == 0) {
                if (oct2 == 0) {
                    if (oct1 == 0) {
                        return "Impossível calcular o Ultimo IP Válido";
                    } else {
                        oct1--;
                    }
                } else {
                    oct2--;
                }
            } else {
                oct3--;
            }
        } else {
            oct4--;
        }
        retorno = oct1 + "." + oct2 + "." + oct3 + "." + oct4;
        return retorno;
    }

    public static String validarIP(String ip, String primeiro, String ultimo) {
        String retorno = null;
        boolean primeiroValido = false;
        boolean ultimoValido = false;

        String[] octetosPrimeiro = split(primeiro, ".");
        String[] octetosUltimo = split(ultimo, ".");
        String[] octetosIP = split(ip, ".");

        int ultimoOct1 = Integer.parseInt(octetosUltimo[0]);
        int ultimoOct2 = Integer.parseInt(octetosUltimo[1]);
        int ultimoOct3 = Integer.parseInt(octetosUltimo[2]);
        int ultimoOct4 = Integer.parseInt(octetosUltimo[3]);

        int primeiroOct1 = Integer.parseInt(octetosPrimeiro[0]);
        int primeiroOct2 = Integer.parseInt(octetosPrimeiro[1]);
        int primeiroOct3 = Integer.parseInt(octetosPrimeiro[2]);
        int primeiroOct4 = Integer.parseInt(octetosPrimeiro[3]);

        int ipOct1 = Integer.parseInt(octetosIP[0]);
        int ipOct2 = Integer.parseInt(octetosIP[1]);
        int ipOct3 = Integer.parseInt(octetosIP[2]);
        int ipOct4 = Integer.parseInt(octetosIP[3]);

        System.out.println("ip: " + ipOct1 + "." + ipOct2 + "." + ipOct3 + "." + ipOct4);
        System.out.println("primeiro: " + primeiroOct1 + "." + primeiroOct2 + "." + primeiroOct3 + "." + primeiroOct4);
        System.out.println("ultimo: " + ultimoOct1 + "." + ultimoOct2 + "." + ultimoOct3 + "." + ultimoOct4);


        if (ipOct1 >= primeiroOct1) {
            System.out.println("###### ENTROU 1");
            if (ipOct2 >= primeiroOct2) {
                System.out.println("###### ENTROU 2");
                if (ipOct3 >= primeiroOct3) {
                    System.out.println("###### ENTROU 3");
                    if (ipOct4 >= primeiroOct4) {
                        System.out.println("###### ENTROU 4");
                        primeiroValido = true;
                    }
                }
            }
        }

        if (ipOct1 <= ultimoOct1) {
            System.out.println("###### ENTROU 11");
            if (ipOct2 <= ultimoOct2) {
                System.out.println("###### ENTROU 12");
                if (ipOct3 <= ultimoOct3) {
                    System.out.println("###### ENTROU 13");
                    if (ipOct4 <= ultimoOct4) {
                        System.out.println("###### ENTROU 14");
                        ultimoValido = true;
                    }
                }
            }
        }
        if (primeiroValido && ultimoValido) {
            retorno = "SIM";
        } else {
            retorno = "NÃO";
        }
        return retorno;
    }

    public static String getPublicoPrivado(String ip) {

        String retorno = null;
        String[] octetosIP = split(ip, ".");

        int ipOct1 = Integer.parseInt(octetosIP[0]);
        int ipOct2 = Integer.parseInt(octetosIP[1]);

        if (ipOct1 == 10 || (ipOct1 == 192 && ipOct2 == 168)) {
            retorno = "PRIVADO";
        } else if (ipOct1 == 172 && ipOct2 >= 16 && ipOct2 <= 31) {
            retorno = "PRIVADO";
        } else {
            retorno = "PÚBLICO";
        }

        return retorno;
    }

    public static int getQuantidadeIPValidoSubRede(String netID, String broadcast) {
        int qtd = 0;
        int dif1 = 1;
        int dif2 = 1;
        int dif3 = 1;
        int dif4 = 1;

        String[] octetosNetID = split(netID, ".");
        String[] octetosBroadcast = split(broadcast, ".");

        int broadcastOct1 = Integer.parseInt(octetosBroadcast[0]);
        int broadcastOct2 = Integer.parseInt(octetosBroadcast[1]);
        int broadcastOct3 = Integer.parseInt(octetosBroadcast[2]);
        int broadcastOct4 = Integer.parseInt(octetosBroadcast[3]);

        int netIDOct1 = Integer.parseInt(octetosNetID[0]);
        int netIDOct2 = Integer.parseInt(octetosNetID[1]);
        int netIDOct3 = Integer.parseInt(octetosNetID[2]);
        int netIDOct4 = Integer.parseInt(octetosNetID[3]);


        if (broadcastOct1 > netIDOct1) {
            dif1 += broadcastOct1 - netIDOct1;
        }
        if (broadcastOct2 > netIDOct2) {
            dif2 += broadcastOct2 - netIDOct2;
        }
        if (broadcastOct3 > netIDOct3) {
            dif3 += broadcastOct3 - netIDOct3;
        }
        if (broadcastOct4 > netIDOct4) {
            dif4 += broadcastOct4 - netIDOct4;
        }

        return (dif1 * dif2 * dif3 * dif4) - 2;
    }

    public static String validarDados(String ip, String bits, Display display) {
        String retorno = null;
        try {
            String[] octetosIP = split(ip, ".");
            int bitsMascara = 0;
            int ipOct1 = Integer.parseInt(octetosIP[0]);
            int ipOct2 = Integer.parseInt(octetosIP[1]);
            int ipOct3 = Integer.parseInt(octetosIP[2]);
            int ipOct4 = Integer.parseInt(octetosIP[3]);
            try {
                bitsMascara = Integer.parseInt(bits);
            } catch (Exception e) {
                retorno = "Digite um valor válido para o número de bits da Máscara";
            }
            if(retorno == null){
                if(ipOct1 > 255 || ipOct1 < 0 ){
                    retorno = "O valor do primeiro octeto é inválido";
                }else if(ipOct2 > 255 || ipOct2 < 0 ){
                    retorno = "O valor do segundo octeto é inválido";
                }else if(ipOct3 > 255 || ipOct3 < 0 ){
                    retorno = "O valor do terceiro octeto é inválido";
                }else if(ipOct4 > 255 || ipOct4 < 0 ){
                    retorno = "O valor do quarto octeto é inválido";
                }
            }
            if(retorno == null){
                if(bitsMascara < 1 || bitsMascara > 30){
                    retorno = "Quantidade de bits inválido. Os valores devem estar entre 0 e 30 bits";
                }
            }
        } catch (Exception e) {
            retorno = "O ip digitado não é válido";
        }
        return retorno;
    }
}
